package scene_widget

import (
	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/canvas"
	"fyne.io/fyne/v2/driver/desktop"
	"fyne.io/fyne/v2/theme"
	"fyne.io/fyne/v2/widget"
	"image/color"
)

// RunButton 自定义运行按钮组件
type RunButton struct {
	widget.BaseWidget
	isRunning         bool
	isEditMode        bool // 编辑模式状态，类似于菜单项的Checked状态
	currentIcon       *canvas.Image
	buttonBackground  *canvas.Rectangle
	onTapped          func()
	OnEditModeChanged func(bool) // 编辑模式改变回调，与MenuController中的回调保持一致
}

// 确保RunButton实现必要的接口
var _ desktop.Hoverable = (*RunButton)(nil)
var _ fyne.Tappable = (*RunButton)(nil)

// NewRunButton 创建一个新的运行按钮
func NewRunButton() *RunButton {
	btn := &RunButton{
		isRunning:  false,
		isEditMode: true, // 默认编辑模式
	}
	btn.ExtendBaseWidget(btn)
	return btn
}

// SetEditMode 设置编辑模式
func (btn *RunButton) SetEditMode(editMode bool) {
	btn.isEditMode = editMode
	btn.Refresh()
}

// CreateRenderer 实现fyne.Widget接口
func (btn *RunButton) CreateRenderer() fyne.WidgetRenderer {
	// 使用实际存在的图标
	runIcon := theme.MediaPlayIcon() // 使用播放图标替代运行图标

	btn.currentIcon = canvas.NewImageFromResource(runIcon)
	btn.currentIcon.FillMode = canvas.ImageFillContain

	btn.buttonBackground = canvas.NewRectangle(color.White)
	btn.buttonBackground.CornerRadius = 4
	btn.buttonBackground.StrokeColor = color.Gray{100}
	btn.buttonBackground.StrokeWidth = 1

	return &runButtonRenderer{
		button: btn,
		objects: []fyne.CanvasObject{
			btn.buttonBackground,
			btn.currentIcon,
		},
	}
}

// runButtonRenderer 运行按钮渲染器
type runButtonRenderer struct {
	button  *RunButton
	objects []fyne.CanvasObject
}

// Layout 布局
func (r *runButtonRenderer) Layout(size fyne.Size) {
	r.button.buttonBackground.Resize(size)
	// 根据按钮大小动态调整图标大小，确保图标不会超出按钮范围
	iconSize := fyne.NewSize(size.Width*0.8, size.Height*0.8) // 图标大小为按钮的80%
	r.button.currentIcon.Resize(iconSize)
	// 居中图标
	iconPos := fyne.NewPos(
		(size.Width-iconSize.Width)/2,
		(size.Height-iconSize.Height)/2,
	)
	r.button.currentIcon.Move(iconPos)
}

// MinSize 返回按钮的最小尺寸
func (r *runButtonRenderer) MinSize() fyne.Size {
	return fyne.NewSize(16, 16) // 保持与Resize一致的最小尺寸
}

// Refresh 刷新
func (r *runButtonRenderer) Refresh() {
	// 状态取反：编辑模式时显示运行图标，非编辑模式时显示编辑图标
	if r.button.isEditMode {
		// 编辑模式：显示运行图标（表示可以运行）
		if r.button.isRunning {
			r.button.currentIcon.Resource = theme.MediaStopIcon()
			r.button.buttonBackground.FillColor = color.RGBA{255, 0, 0, 100} // 运行时显示红色背景
		} else {
			r.button.currentIcon.Resource = theme.MediaPlayIcon()
			r.button.buttonBackground.FillColor = color.RGBA{0, 255, 0, 100} // 准备运行时显示绿色背景
		}
	} else {
		// 非编辑模式：显示编辑图标（表示可以编辑）
		r.button.currentIcon.Resource = theme.DocumentCreateIcon()
		r.button.buttonBackground.FillColor = color.RGBA{0, 0, 255, 100} // 编辑模式显示蓝色背景
	}

	for _, obj := range r.objects {
		obj.Refresh()
	}
}

// Objects 对象列表
func (r *runButtonRenderer) Objects() []fyne.CanvasObject {
	return r.objects
}

// Destroy 销毁
func (r *runButtonRenderer) Destroy() {}

// Tapped 点击事件 - 修改为与编辑菜单项相同的功能
func (btn *RunButton) Tapped(_ *fyne.PointEvent) {
	// 切换编辑模式状态，与MenuController中的editItem.Action相同
	btn.isEditMode = !btn.isEditMode

	// 触发编辑模式改变回调
	if btn.OnEditModeChanged != nil {
		btn.OnEditModeChanged(btn.isEditMode)
	}

	// 如果设置了自定义点击回调，也执行它
	if btn.onTapped != nil {
		btn.onTapped()
	}

	// 刷新按钮以更新显示
	btn.Refresh()
}

// MouseIn 鼠标进入
func (btn *RunButton) MouseIn(_ *desktop.MouseEvent) {
	btn.buttonBackground.StrokeColor = color.Black
	btn.Refresh()
}

// MouseOut 鼠标离开
func (btn *RunButton) MouseOut() {
	btn.buttonBackground.StrokeColor = color.Gray{100}
	btn.Refresh()
}

// MouseMoved 鼠标移动
func (btn *RunButton) MouseMoved(_ *desktop.MouseEvent) {}

// SetOnTapped 设置点击回调
func (btn *RunButton) SetOnTapped(fn func()) {
	btn.onTapped = fn
}
